Don't ignore the return value of gtk_widget_activate().
authorFederico Mena Quintero <federico@ximian.com>
Fri, 12 Mar 2004 20:38:54 +0000 (20:38 +0000)
committerFederico Mena Quintero <federico@src.gnome.org>
Fri, 12 Mar 2004 20:38:54 +0000 (20:38 +0000)
2004-03-12  Federico Mena Quintero  <federico@ximian.com>

* gtk/gtkwindow.c (gtk_window_activate_focus): Don't ignore the
return value of gtk_widget_activate().
(gtk_window_activate_default): Likewise.  Fixes #137008.

* gtk/gtkfilechooserdialog.c (response_cb): Act on positive
response IDs we recognize, rather than bailing out on cancellation
ones.  Fixes #136237; patch by Olivier Andrieu
<oliv__a@users.sourceforge.net>.
(file_chooser_widget_file_activated): If the dialog doesn't have a
default widget, try to find a suitable response widget on our own.
People should *really* be using gtk_dialog_set_default_response(),
but this is to help lazy programmers.

* gtk/gtkdialog.c (_gtk_dialog_get_response_for_widget): New
internal function.
(get_response_data): Add a "create" argument so that we don't
unconditionally create the response data.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkdialog.c
gtk/gtkdialog.h
gtk/gtkfilechooserdialog.c
gtk/gtkwindow.c

index 939d383cb6d5ecce5fa1cb131b27a6bef26b7909..9d46ec669ef5204023f91904660234396ceffea6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2004-03-12  Federico Mena Quintero  <federico@ximian.com>
+
+       * gtk/gtkwindow.c (gtk_window_activate_focus): Don't ignore the
+       return value of gtk_widget_activate().
+       (gtk_window_activate_default): Likewise.  Fixes #137008.
+
+       * gtk/gtkfilechooserdialog.c (response_cb): Act on positive
+       response IDs we recognize, rather than bailing out on cancellation
+       ones.  Fixes #136237; patch by Olivier Andrieu
+       <oliv__a@users.sourceforge.net>.
+       (file_chooser_widget_file_activated): If the dialog doesn't have a
+       default widget, try to find a suitable response widget on our own.
+       People should *really* be using gtk_dialog_set_default_response(),
+       but this is to help lazy programmers.
+
+       * gtk/gtkdialog.c (_gtk_dialog_get_response_for_widget): New
+       internal function.
+       (get_response_data): Add a "create" argument so that we don't
+       unconditionally create the response data.
+
 2004-03-12  Morten Welinder  <terra@gnome.org>
 
        * tests/Makefile.am: Add new testspinbutton.c
index 939d383cb6d5ecce5fa1cb131b27a6bef26b7909..9d46ec669ef5204023f91904660234396ceffea6 100644 (file)
@@ -1,3 +1,23 @@
+2004-03-12  Federico Mena Quintero  <federico@ximian.com>
+
+       * gtk/gtkwindow.c (gtk_window_activate_focus): Don't ignore the
+       return value of gtk_widget_activate().
+       (gtk_window_activate_default): Likewise.  Fixes #137008.
+
+       * gtk/gtkfilechooserdialog.c (response_cb): Act on positive
+       response IDs we recognize, rather than bailing out on cancellation
+       ones.  Fixes #136237; patch by Olivier Andrieu
+       <oliv__a@users.sourceforge.net>.
+       (file_chooser_widget_file_activated): If the dialog doesn't have a
+       default widget, try to find a suitable response widget on our own.
+       People should *really* be using gtk_dialog_set_default_response(),
+       but this is to help lazy programmers.
+
+       * gtk/gtkdialog.c (_gtk_dialog_get_response_for_widget): New
+       internal function.
+       (get_response_data): Add a "create" argument so that we don't
+       unconditionally create the response data.
+
 2004-03-12  Morten Welinder  <terra@gnome.org>
 
        * tests/Makefile.am: Add new testspinbutton.c
index 939d383cb6d5ecce5fa1cb131b27a6bef26b7909..9d46ec669ef5204023f91904660234396ceffea6 100644 (file)
@@ -1,3 +1,23 @@
+2004-03-12  Federico Mena Quintero  <federico@ximian.com>
+
+       * gtk/gtkwindow.c (gtk_window_activate_focus): Don't ignore the
+       return value of gtk_widget_activate().
+       (gtk_window_activate_default): Likewise.  Fixes #137008.
+
+       * gtk/gtkfilechooserdialog.c (response_cb): Act on positive
+       response IDs we recognize, rather than bailing out on cancellation
+       ones.  Fixes #136237; patch by Olivier Andrieu
+       <oliv__a@users.sourceforge.net>.
+       (file_chooser_widget_file_activated): If the dialog doesn't have a
+       default widget, try to find a suitable response widget on our own.
+       People should *really* be using gtk_dialog_set_default_response(),
+       but this is to help lazy programmers.
+
+       * gtk/gtkdialog.c (_gtk_dialog_get_response_for_widget): New
+       internal function.
+       (get_response_data): Add a "create" argument so that we don't
+       unconditionally create the response data.
+
 2004-03-12  Morten Welinder  <terra@gnome.org>
 
        * tests/Makefile.am: Add new testspinbutton.c
index 939d383cb6d5ecce5fa1cb131b27a6bef26b7909..9d46ec669ef5204023f91904660234396ceffea6 100644 (file)
@@ -1,3 +1,23 @@
+2004-03-12  Federico Mena Quintero  <federico@ximian.com>
+
+       * gtk/gtkwindow.c (gtk_window_activate_focus): Don't ignore the
+       return value of gtk_widget_activate().
+       (gtk_window_activate_default): Likewise.  Fixes #137008.
+
+       * gtk/gtkfilechooserdialog.c (response_cb): Act on positive
+       response IDs we recognize, rather than bailing out on cancellation
+       ones.  Fixes #136237; patch by Olivier Andrieu
+       <oliv__a@users.sourceforge.net>.
+       (file_chooser_widget_file_activated): If the dialog doesn't have a
+       default widget, try to find a suitable response widget on our own.
+       People should *really* be using gtk_dialog_set_default_response(),
+       but this is to help lazy programmers.
+
+       * gtk/gtkdialog.c (_gtk_dialog_get_response_for_widget): New
+       internal function.
+       (get_response_data): Add a "create" argument so that we don't
+       unconditionally create the response data.
+
 2004-03-12  Morten Welinder  <terra@gnome.org>
 
        * tests/Makefile.am: Add new testspinbutton.c
index 939d383cb6d5ecce5fa1cb131b27a6bef26b7909..9d46ec669ef5204023f91904660234396ceffea6 100644 (file)
@@ -1,3 +1,23 @@
+2004-03-12  Federico Mena Quintero  <federico@ximian.com>
+
+       * gtk/gtkwindow.c (gtk_window_activate_focus): Don't ignore the
+       return value of gtk_widget_activate().
+       (gtk_window_activate_default): Likewise.  Fixes #137008.
+
+       * gtk/gtkfilechooserdialog.c (response_cb): Act on positive
+       response IDs we recognize, rather than bailing out on cancellation
+       ones.  Fixes #136237; patch by Olivier Andrieu
+       <oliv__a@users.sourceforge.net>.
+       (file_chooser_widget_file_activated): If the dialog doesn't have a
+       default widget, try to find a suitable response widget on our own.
+       People should *really* be using gtk_dialog_set_default_response(),
+       but this is to help lazy programmers.
+
+       * gtk/gtkdialog.c (_gtk_dialog_get_response_for_widget): New
+       internal function.
+       (get_response_data): Add a "create" argument so that we don't
+       unconditionally create the response data.
+
 2004-03-12  Morten Welinder  <terra@gnome.org>
 
        * tests/Makefile.am: Add new testspinbutton.c
index f6545776bd6e0a646853924aa29bd9ac395f63b3..357b1cd2ea76a93d67a27b3947a070b6285faeab 100644 (file)
@@ -74,7 +74,8 @@ static void gtk_dialog_map               (GtkWidget        *widget);
 
 static void gtk_dialog_close             (GtkDialog        *dialog);
 
-static ResponseData* get_response_data   (GtkWidget        *widget);
+static ResponseData* get_response_data   (GtkWidget        *widget,
+                                         gboolean          create);
 
 enum {
   PROP_0,
@@ -378,7 +379,7 @@ dialog_has_cancel (GtkDialog *dialog)
 
   for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
     {
-      ResponseData *rd = get_response_data (tmp_list->data);
+      ResponseData *rd = get_response_data (tmp_list->data, FALSE);
       
       if (rd && rd->response_id == GTK_RESPONSE_CANCEL)
        {
@@ -510,12 +511,13 @@ gtk_dialog_new_with_buttons (const gchar    *title,
 }
 
 static ResponseData*
-get_response_data (GtkWidget *widget)
+get_response_data (GtkWidget *widget,
+                  gboolean   create)
 {
   ResponseData *ad = g_object_get_data (G_OBJECT (widget),
                                         "gtk-dialog-response-data");
 
-  if (ad == NULL)
+  if (ad == NULL && create)
     {
       ad = g_new (ResponseData, 1);
       
@@ -538,7 +540,7 @@ action_widget_activated (GtkWidget *widget, GtkDialog *dialog)
 
   response_id = GTK_RESPONSE_NONE;
   
-  ad = get_response_data (widget);
+  ad = get_response_data (widget, TRUE);
 
   g_assert (ad != NULL);
   
@@ -571,7 +573,7 @@ gtk_dialog_add_action_widget (GtkDialog *dialog,
   g_return_if_fail (GTK_IS_DIALOG (dialog));
   g_return_if_fail (GTK_IS_WIDGET (child));
 
-  ad = get_response_data (child);
+  ad = get_response_data (child, TRUE);
 
   ad->response_id = response_id;
 
@@ -1035,3 +1037,16 @@ _gtk_dialog_set_ignore_separator (GtkDialog *dialog,
   priv = GET_PRIVATE (dialog);
   priv->ignore_separator = ignore_separator;
 }
+
+gint
+_gtk_dialog_get_response_for_widget (GtkDialog *dialog,
+                                    GtkWidget *widget)
+{
+  ResponseData *rd;
+
+  rd = get_response_data (widget, FALSE);
+  if (!rd)
+    return GTK_RESPONSE_NONE;
+  else
+    return rd->response_id;
+}
index 60c860fa47f1e94dec482e6edd0f61666ad92dcf..4e64e24b90a1de94d7c085cd2439be425250d5fa 100644 (file)
@@ -163,6 +163,8 @@ gint gtk_dialog_run                (GtkDialog *dialog);
 /* For private use only */
 void _gtk_dialog_set_ignore_separator (GtkDialog *dialog,
                                       gboolean   ignore_separator);
+gint _gtk_dialog_get_response_for_widget (GtkDialog *dialog,
+                                         GtkWidget *widget);
 
 #ifdef __cplusplus
 }
index 6de17f1a7a6273606460df088168ff11ad97cac4..24ea732b6ed0b94a077fe91056ac17be82545e60 100644 (file)
@@ -162,7 +162,35 @@ static void
 file_chooser_widget_file_activated (GtkFileChooser       *chooser,
                                    GtkFileChooserDialog *dialog)
 {
-  gtk_window_activate_default (GTK_WINDOW (dialog));
+  GList *children, *l;
+
+  if (gtk_window_activate_default (GTK_WINDOW (dialog)))
+    return;
+
+  /* There probably isn't a default widget, so make things easier for the
+   * programmer by looking for a reasonable button on our own.
+   */
+
+  children = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area));
+
+  for (l = children; l; l = l->next)
+    {
+      GtkWidget *widget;
+      int response_id;
+
+      widget = GTK_WIDGET (l->data);
+      response_id = _gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog), widget);
+      if (response_id == GTK_RESPONSE_ACCEPT
+         || response_id == GTK_RESPONSE_OK
+         || response_id == GTK_RESPONSE_YES
+         || response_id == GTK_RESPONSE_APPLY)
+       {
+         gtk_widget_activate (widget); /* Should we gtk_dialog_response (dialog, response_id) instead? */
+         break;
+       }
+    }
+
+  g_list_free (children);
 }
 
 static void
@@ -465,14 +493,11 @@ response_cb (GtkDialog *dialog,
 
   priv = GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE (dialog);
 
-  /* Ugh, try to filter out cancel-type responses */
-  if (response_id == GTK_RESPONSE_NONE
-      || response_id == GTK_RESPONSE_REJECT
-      || response_id == GTK_RESPONSE_DELETE_EVENT
-      || response_id == GTK_RESPONSE_CANCEL
-      || response_id == GTK_RESPONSE_CLOSE
-      || response_id == GTK_RESPONSE_NO
-      || response_id == GTK_RESPONSE_HELP)
+  /* Act only on response IDs we recognize */
+  if (!(response_id == GTK_RESPONSE_ACCEPT
+       || response_id == GTK_RESPONSE_OK
+       || response_id == GTK_RESPONSE_YES
+       || response_id == GTK_RESPONSE_APPLY))
     return;
 
   if (!_gtk_file_chooser_embed_should_respond (GTK_FILE_CHOOSER_EMBED (priv->widget)))
index a9150d52e4da489fd4ed6b5fdc813c9d4042b1ed..83d8c1cb73af734a1d9077254ba328013e562614 100644 (file)
@@ -1571,12 +1571,8 @@ gtk_window_activate_focus (GtkWindow *window)
 {
   g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
 
-  if (window->focus_widget)
-    {
-      if (GTK_WIDGET_IS_SENSITIVE (window->focus_widget))
-        gtk_widget_activate (window->focus_widget);
-      return TRUE;
-    }
+  if (window->focus_widget && GTK_WIDGET_IS_SENSITIVE (window->focus_widget))
+    return gtk_widget_activate (window->focus_widget);
 
   return FALSE;
 }
@@ -1619,16 +1615,9 @@ gtk_window_activate_default (GtkWindow *window)
 
   if (window->default_widget && GTK_WIDGET_IS_SENSITIVE (window->default_widget) &&
       (!window->focus_widget || !GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget)))
-    {
-      gtk_widget_activate (window->default_widget);
-      return TRUE;
-    }
-  else if (window->focus_widget)
-    {
-      if (GTK_WIDGET_IS_SENSITIVE (window->focus_widget))
-        gtk_widget_activate (window->focus_widget);
-      return TRUE;
-    }
+    return gtk_widget_activate (window->default_widget);
+  else if (window->focus_widget && GTK_WIDGET_IS_SENSITIVE (window->focus_widget))
+    return gtk_widget_activate (window->focus_widget);
 
   return FALSE;
 }